package service

import (
	"context"
	"errors"
	"fmt"
	"gitee.com/chunanyong/logger"
	"gitee.com/chunanyong/zorm"
	"zorm-learn/app/dbapi/model"
)

// SaveTrendChartPointsStruct 保存 趋势图点位数据
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func SaveTrendChartPointsStruct(ctx context.Context, trendchartpointsstruct *model.TrendChartPointsStruct) error {

	// trendchartpointsstruct对象指针不能为空
	if trendchartpointsstruct == nil {
		return errors.New("trendchartpointsstruct对象指针不能为空")
	}
	//匿名函数return的error如果不为nil,事务就会回滚
	_, errSaveTrendChartPointsStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始

		_, errSaveTrendChartPointsStruct := zorm.Insert(ctx, trendchartpointsstruct)

		if errSaveTrendChartPointsStruct != nil {
			return nil, errSaveTrendChartPointsStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errSaveTrendChartPointsStruct != nil {
		errSaveTrendChartPointsStruct := fmt.Errorf("service.SaveTrendChartPointsStruct错误:%w", errSaveTrendChartPointsStruct)
		logger.Error(errSaveTrendChartPointsStruct)
		return errSaveTrendChartPointsStruct
	}

	return nil
}

// UpdateTrendChartPointsStruct 更新趋势图点位数据
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateTrendChartPointsStruct(ctx context.Context, trendchartpointsstruct *model.TrendChartPointsStruct) error {

	// trendchartpointsstruct对象指针或主键Id不能为空
	if trendchartpointsstruct == nil || trendchartpointsstruct.Id < 1 {
		return errors.New("trendchartpointsstruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateTrendChartPointsStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateTrendChartPointsStruct := zorm.Update(ctx, trendchartpointsstruct)

		if errUpdateTrendChartPointsStruct != nil {
			return nil, errUpdateTrendChartPointsStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateTrendChartPointsStruct != nil {
		errUpdateTrendChartPointsStruct := fmt.Errorf("service.UpdateTrendChartPointsStruct错误:%w", errUpdateTrendChartPointsStruct)
		logger.Error(errUpdateTrendChartPointsStruct)
		return errUpdateTrendChartPointsStruct
	}

	return nil
}

// UpdateNotZeroTrendChartPointsStruct 更新趋势图点位数据
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateNotZeroTrendChartPointsStruct(ctx context.Context, trendchartpointsstruct *model.TrendChartPointsStruct) error {

	// trendchartpointsstruct对象指针或主键Id不能为空
	if trendchartpointsstruct == nil || trendchartpointsstruct.Id < 1 {
		return errors.New("trendchartpointsstruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateTrendChartPointsStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateTrendChartPointsStruct := zorm.UpdateNotZeroValue(ctx, trendchartpointsstruct)

		if errUpdateTrendChartPointsStruct != nil {
			return nil, errUpdateTrendChartPointsStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateTrendChartPointsStruct != nil {
		errUpdateTrendChartPointsStruct := fmt.Errorf("service.UpdateNotZeroTrendChartPointsStruct错误:%w", errUpdateTrendChartPointsStruct)
		logger.Error(errUpdateTrendChartPointsStruct)
		return errUpdateTrendChartPointsStruct
	}

	return nil
}

// DeleteTrendChartPointsStructById 根据Id删除趋势图点位数据
// 如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
// 如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
// 如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
// 但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func DeleteTrendChartPointsStructById(ctx context.Context, id string) error {

	//id不能为空
	if len(id) < 1 {
		return errors.New("id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errDeleteTrendChartPointsStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		finder := zorm.NewDeleteFinder(model.TrendChartPointsStructTableName).Append(" WHERE id=?", id)
		_, errDeleteTrendChartPointsStruct := zorm.UpdateFinder(ctx, finder)

		if errDeleteTrendChartPointsStruct != nil {
			return nil, errDeleteTrendChartPointsStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errDeleteTrendChartPointsStruct != nil {
		errDeleteTrendChartPointsStruct := fmt.Errorf("service.DeleteTrendChartPointsStruct错误:%w", errDeleteTrendChartPointsStruct)
		logger.Error(errDeleteTrendChartPointsStruct)
		return errDeleteTrendChartPointsStruct
	}

	return nil
}

// FindTrendChartPointsStructById 根据Id查询趋势图点位数据信息
// ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindTrendChartPointsStructById(ctx context.Context, id string) (*model.TrendChartPointsStruct, error) {
	//id不能为空
	if len(id) < 1 {
		return nil, errors.New("id不能为空")
	}

	//根据Id查询
	finder := zorm.NewSelectFinder(model.TrendChartPointsStructTableName).Append(" WHERE id=?", id)
	trendchartpointsstruct := model.TrendChartPointsStruct{}
	has, errFindTrendChartPointsStructById := zorm.QueryRow(ctx, finder, &trendchartpointsstruct)

	//记录错误
	if errFindTrendChartPointsStructById != nil {
		errFindTrendChartPointsStructById := fmt.Errorf("service.FindTrendChartPointsStructById错误:%w", errFindTrendChartPointsStructById)
		logger.Error(errFindTrendChartPointsStructById)
		return nil, errFindTrendChartPointsStructById
	}

	if !has {
		return nil, nil
	}

	return &trendchartpointsstruct, nil

}

// FindTrendChartPointsStructList 根据Finder查询趋势图点位数据列表
// ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindTrendChartPointsStructList(ctx context.Context, finder *zorm.Finder, page *zorm.Page) ([]model.TrendChartPointsStruct, error) {

	//finder不能为空
	if finder == nil {
		return nil, errors.New("finder不能为空")
	}

	trendchartpointsstructList := make([]model.TrendChartPointsStruct, 0)
	errFindTrendChartPointsStructList := zorm.Query(ctx, finder, &trendchartpointsstructList, page)

	//记录错误
	if errFindTrendChartPointsStructList != nil {
		errFindTrendChartPointsStructList := fmt.Errorf("service.FindTrendChartPointsStructList错误:%w", errFindTrendChartPointsStructList)
		logger.Error(errFindTrendChartPointsStructList)
		return nil, errFindTrendChartPointsStructList
	}

	return trendchartpointsstructList, nil
}
